package com.cencat.user.enums;

import lombok.Getter;

/**
 * 权限类型枚举
 * @author cencat
 * @since 2024-01-01
 */
@Getter
public enum PermissionType {

    /**
     * 菜单权限
     */
    MENU("MENU", "菜单权限", "用于控制菜单的访问权限", 1, "menu", "#1890ff"),

    /**
     * 按钮权限
     */
    BUTTON("BUTTON", "按钮权限", "用于控制页面按钮的操作权限", 2, "button", "#52c41a"),

    /**
     * API权限
     */
    API("API", "接口权限", "用于控制API接口的访问权限", 3, "api", "#fa8c16"),

    /**
     * 数据权限
     */
    DATA("DATA", "数据权限", "用于控制数据的访问范围权限", 4, "database", "#722ed1"),

    /**
     * 系统权限
     */
    SYSTEM("SYSTEM", "系统权限", "用于控制系统级别的操作权限", 5, "system", "#f5222d"),

    /**
     * 文件权限
     */
    FILE("FILE", "文件权限", "用于控制文件的访问和操作权限", 6, "file", "#13c2c2"),

    /**
     * 报表权限
     */
    REPORT("REPORT", "报表权限", "用于控制报表的查看和导出权限", 7, "report", "#eb2f96"),

    /**
     * 审批权限
     */
    APPROVAL("APPROVAL", "审批权限", "用于控制审批流程的操作权限", 8, "approval", "#faad14"),

    /**
     * 配置权限
     */
    CONFIG("CONFIG", "配置权限", "用于控制系统配置的修改权限", 9, "config", "#a0d911"),

    /**
     * 监控权限
     */
    MONITOR("MONITOR", "监控权限", "用于控制系统监控功能的访问权限", 10, "monitor", "#ff7a45"),

    /**
     * 日志权限
     */
    LOG("LOG", "日志权限", "用于控制日志查看和管理权限", 11, "log", "#9254de"),

    /**
     * 消息权限
     */
    MESSAGE("MESSAGE", "消息权限", "用于控制消息发送和接收权限", 12, "message", "#36cfc9"),

    /**
     * 通知权限
     */
    NOTIFICATION("NOTIFICATION", "通知权限", "用于控制通知的发送和管理权限", 13, "notification", "#ffc53d"),

    /**
     * 导入权限
     */
    IMPORT("IMPORT", "导入权限", "用于控制数据导入功能的权限", 14, "import", "#40a9ff"),

    /**
     * 导出权限
     */
    EXPORT("EXPORT", "导出权限", "用于控制数据导出功能的权限", 15, "export", "#73d13d"),

    /**
     * 打印权限
     */
    PRINT("PRINT", "打印权限", "用于控制打印功能的权限", 16, "print", "#ff9c6e"),

    /**
     * 备份权限
     */
    BACKUP("BACKUP", "备份权限", "用于控制数据备份功能的权限", 17, "backup", "#b37feb"),

    /**
     * 恢复权限
     */
    RESTORE("RESTORE", "恢复权限", "用于控制数据恢复功能的权限", 18, "restore", "#ff85c0"),

    /**
     * 缓存权限
     */
    CACHE("CACHE", "缓存权限", "用于控制缓存管理功能的权限", 19, "cache", "#87e8de"),

    /**
     * 其他权限
     */
    OTHER("OTHER", "其他权限", "用于控制其他未分类功能的权限", 99, "other", "#d9d9d9");

    /**
     * 权限类型编码
     */
    private final String code;

    /**
     * 权限类型名称
     */
    private final String name;

    /**
     * 权限类型描述
     */
    private final String description;

    /**
     * 权限类型级别
     */
    private final Integer level;

    /**
     * 权限类型图标
     */
    private final String icon;

    /**
     * 权限类型颜色
     */
    private final String color;

    /**
     * 构造函数
     * @param code 权限类型编码
     * @param name 权限类型名称
     * @param description 权限类型描述
     * @param level 权限类型级别
     * @param icon 权限类型图标
     * @param color 权限类型颜色
     */
    PermissionType(String code, String name, String description, Integer level, String icon, String color) {
        this.code = code;
        this.name = name;
        this.description = description;
        this.level = level;
        this.icon = icon;
        this.color = color;
    }

    /**
     * 根据编码获取权限类型
     * @param code 权限类型编码
     * @return 权限类型
     */
    public static PermissionType fromCode(String code) {
        if (code == null || code.trim().isEmpty()) {
            return null;
        }
        
        for (PermissionType type : values()) {
            if (type.getCode().equals(code.toUpperCase())) {
                return type;
            }
        }
        
        return null;
    }

    /**
     * 根据名称获取权限类型
     * @param name 权限类型名称
     * @return 权限类型
     */
    public static PermissionType fromName(String name) {
        if (name == null || name.trim().isEmpty()) {
            return null;
        }
        
        for (PermissionType type : values()) {
            if (type.getName().equals(name)) {
                return type;
            }
        }
        
        return null;
    }

    /**
     * 根据级别获取权限类型
     * @param level 权限类型级别
     * @return 权限类型
     */
    public static PermissionType fromLevel(Integer level) {
        if (level == null) {
            return null;
        }
        
        for (PermissionType type : values()) {
            if (type.getLevel().equals(level)) {
                return type;
            }
        }
        
        return null;
    }

    /**
     * 获取显示名称
     * @return 显示名称
     */
    public String getDisplayName() {
        return name;
    }

    /**
     * 获取完整描述
     * @return 完整描述
     */
    public String getFullDescription() {
        return name + "：" + description;
    }

    /**
     * 检查是否为菜单权限
     * @return 是否为菜单权限
     */
    public boolean isMenu() {
        return this == MENU;
    }

    /**
     * 检查是否为按钮权限
     * @return 是否为按钮权限
     */
    public boolean isButton() {
        return this == BUTTON;
    }

    /**
     * 检查是否为API权限
     * @return 是否为API权限
     */
    public boolean isApi() {
        return this == API;
    }

    /**
     * 检查是否为数据权限
     * @return 是否为数据权限
     */
    public boolean isData() {
        return this == DATA;
    }

    /**
     * 检查是否为系统权限
     * @return 是否为系统权限
     */
    public boolean isSystem() {
        return this == SYSTEM;
    }

    /**
     * 检查是否为文件权限
     * @return 是否为文件权限
     */
    public boolean isFile() {
        return this == FILE;
    }

    /**
     * 检查是否为报表权限
     * @return 是否为报表权限
     */
    public boolean isReport() {
        return this == REPORT;
    }

    /**
     * 检查是否为审批权限
     * @return 是否为审批权限
     */
    public boolean isApproval() {
        return this == APPROVAL;
    }

    /**
     * 检查是否为配置权限
     * @return 是否为配置权限
     */
    public boolean isConfig() {
        return this == CONFIG;
    }

    /**
     * 检查是否为监控权限
     * @return 是否为监控权限
     */
    public boolean isMonitor() {
        return this == MONITOR;
    }

    /**
     * 检查是否为日志权限
     * @return 是否为日志权限
     */
    public boolean isLog() {
        return this == LOG;
    }

    /**
     * 检查是否为消息权限
     * @return 是否为消息权限
     */
    public boolean isMessage() {
        return this == MESSAGE;
    }

    /**
     * 检查是否为通知权限
     * @return 是否为通知权限
     */
    public boolean isNotification() {
        return this == NOTIFICATION;
    }

    /**
     * 检查是否为导入权限
     * @return 是否为导入权限
     */
    public boolean isImport() {
        return this == IMPORT;
    }

    /**
     * 检查是否为导出权限
     * @return 是否为导出权限
     */
    public boolean isExport() {
        return this == EXPORT;
    }

    /**
     * 检查是否为打印权限
     * @return 是否为打印权限
     */
    public boolean isPrint() {
        return this == PRINT;
    }

    /**
     * 检查是否为备份权限
     * @return 是否为备份权限
     */
    public boolean isBackup() {
        return this == BACKUP;
    }

    /**
     * 检查是否为恢复权限
     * @return 是否为恢复权限
     */
    public boolean isRestore() {
        return this == RESTORE;
    }

    /**
     * 检查是否为缓存权限
     * @return 是否为缓存权限
     */
    public boolean isCache() {
        return this == CACHE;
    }

    /**
     * 检查是否为其他权限
     * @return 是否为其他权限
     */
    public boolean isOther() {
        return this == OTHER;
    }

    /**
     * 检查是否为核心权限类型（菜单、按钮、API、数据、系统）
     * @return 是否为核心权限类型
     */
    public boolean isCore() {
        return this == MENU || this == BUTTON || this == API || this == DATA || this == SYSTEM;
    }

    /**
     * 检查是否为扩展权限类型
     * @return 是否为扩展权限类型
     */
    public boolean isExtended() {
        return !isCore() && this != OTHER;
    }

    /**
     * 检查是否为高级别权限（级别小于等于5）
     * @return 是否为高级别权限
     */
    public boolean isHighLevel() {
        return level <= 5;
    }

    /**
     * 检查是否为低级别权限（级别大于5）
     * @return 是否为低级别权限
     */
    public boolean isLowLevel() {
        return level > 5;
    }

    /**
     * 获取权限类型的CSS类名
     * @return CSS类名
     */
    public String getCssClass() {
        return "permission-type-" + code.toLowerCase();
    }

    /**
     * 获取权限类型的标签样式
     * @return 标签样式
     */
    public String getTagStyle() {
        return "background-color: " + color + "; color: white; padding: 2px 8px; border-radius: 4px; font-size: 12px;";
    }

    /**
     * 获取权限类型的图标HTML
     * @return 图标HTML
     */
    public String getIconHtml() {
        return "<i class='icon-" + icon + "' style='color: " + color + ";'></i>";
    }

    /**
     * 比较权限类型级别
     * @param other 其他权限类型
     * @return 比较结果（负数：当前级别更高，0：级别相同，正数：当前级别更低）
     */
    public int compareLevel(PermissionType other) {
        if (other == null) {
            return -1;
        }
        return this.level.compareTo(other.level);
    }

    /**
     * 检查是否比指定权限类型级别更高
     * @param other 其他权限类型
     * @return 是否级别更高
     */
    public boolean isHigherThan(PermissionType other) {
        return compareLevel(other) < 0;
    }

    /**
     * 检查是否比指定权限类型级别更低
     * @param other 其他权限类型
     * @return 是否级别更低
     */
    public boolean isLowerThan(PermissionType other) {
        return compareLevel(other) > 0;
    }

    /**
     * 检查是否与指定权限类型级别相同
     * @param other 其他权限类型
     * @return 是否级别相同
     */
    public boolean isSameLevelAs(PermissionType other) {
        return compareLevel(other) == 0;
    }

    /**
     * 获取权限类型的JSON表示
     * @return JSON字符串
     */
    public String toJson() {
        return "{" +
                "\"code\":\"" + code + "\"," +
                "\"name\":\"" + name + "\"," +
                "\"description\":\"" + description + "\"," +
                "\"level\":" + level + "," +
                "\"icon\":\"" + icon + "\"," +
                "\"color\":\"" + color + "\"" +
                "}";
    }

    /**
     * 转换为字符串
     * @return 字符串表示
     */
    @Override
    public String toString() {
        return "PermissionType{" +
                "code='" + code + '\'' +
                ", name='" + name + '\'' +
                ", description='" + description + '\'' +
                ", level=" + level +
                ", icon='" + icon + '\'' +
                ", color='" + color + '\'' +
                '}';
    }
}